5.3 历史移位寄存器
分支方向预测器常被设计为由程序计数器和分支历史共同索引的计数器表格形式。分支历史是一系列最近分支的“执行”或“未执行”结果序列。
在硬件中,分支历史寄存器可以实现为N位移位寄存器。在每次预测分支方向后,其预测结果会被移位进入移位寄存器。因此,移位寄存器保存了最近N个分支的结果。
额外的复杂性源于流水线刷新,因为分支预测是推测性的进行。当分支预测失误发生时,处理器状态需要回滚到失误预测分支之后的即时状态。这包括回滚全局历史寄存器,它可能包含由比失误预测分支更年轻的分支移位进来的预测分支结果,但现在这些结果需要被丢弃。
这里我们假设,除了分支预测器之外还有硬件记得用于预测每个分支的分支历史寄存器的状态,这些状态被保存下来以便后续用于分支预测器训练和流水线刷新。当分支预测失误发生时,这个硬件会通知分支预测器有分支预测失误,该分支应有的执行方向,以及对应于程序中失误预测分支前状态的分支历史寄存器状态。
当然,由于处理器会重启到失误预测分支之后的位置,所以在流水线刷新后,分支历史寄存器需要在末尾追加失误预测分支的实际执行方向。
描述
构建一个32位的全局历史移位寄存器,包括对因分支预测失误导致的流水线刷新做出响应时,支持状态回滚的功能。
当做出分支预测(predict_valid = 1)时,从最低有效位(LSB)侧移入predict_taken,以更新预测分支的分支历史。(predict_history[0]代表最年轻的分支方向。)
当发生分支预测失误(train_mispredicted = 1)时,使用失误预测分支完成后的历史(即失误预测分支前的历史train_history与该分支实际结果train_taken的拼接)来装载分支历史寄存器。
如果预测和预测失误同时发生,那么预测失误优先,因为流水线刷新也会清除当前正在进行预测的分支。
predict_history是分支历史寄存器的值。
areset是一个异步复位,它会将历史计数器重置为零。
带周围硬件的分支历史寄存器。本练习将构建位于蓝色虚线矩形内的分支历史寄存器。该图展示了分支执行单元发出分支预测失误的信号,但根据处理器设计的不同,这也可以在指令退役阶段或其他某个时刻进行。
模块声明
module top_module(
input clk,
input areset,
input predict_valid,
input predict_taken,
output [31:0] predict_history,
input train_mispredicted,
input train_taken,
input [31:0] train_history
);